package com.zmn.mcc.persistence.interfaces.staff;

import com.zmn.common.dto.StatusDTO;
import com.zmn.common.dto.VtDTO;
import com.zmn.mcc.common.dto.staff.StaffIdAndRealNameDRO;
import com.zmn.mcc.model.dto.staff.McStaffSimpleDTO;
import com.zmn.mcc.model.entity.staff.McStaff;
import com.zmn.mcc.model.entity.staff.McStaffQuery;
import com.zmn.mcc.model.entity.staff.StaffIdAndBsUserId;
import com.zmn.mcc.model.entity.staff.StaffIdAndDTalkId;
import com.zmn.mcc.model.entity.staff.StaffIdAndDeptId;
import com.zmn.mcc.model.vo.McStaffVO;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * @author heguanghua
 * @since 2020/04/14 10:52
 */
public interface StaffDao {

    McStaff findByKey(Integer staffId);

    McStaff findForLogin(McStaffQuery query);

    /**
     * 根据钉钉userId查询员工信息
     *
     * @return Staff
     */
    McStaff findByDTalkId(@Param("dUserid") String dUserid);

    Integer findStaffNameExists(McStaff staff);

    Integer findMobileExists(McStaff staff);

    Integer findMailExists(McStaff staff);

    /**
     * 描述: 查询指定的用户信息
     *
     * @param dingTalkId
     * @return com.zmn.mcc.model.entity.staff.McStaff
     * @author jiafei
     * @since 2021/8/12 14:24
     */
    McStaff findStaffByDingTalkId(@Param("dingTalkId") String dingTalkId);

    /**
     * 根据员工id查询员工工作地城市
     *
     * @param staffId 员工ID
     * @return 工作地城市
     * @author xujie
     * @since 2021/03/16
     */
    Integer getWorkPlaceCity(Integer staffId);

    /**
     * 用于工号是否唯一判断
     *
     * @param staff
     * @return
     */
    Integer findStaffNumberExists(McStaff staff);

    /**
     * 描述: 查询工程师或者劳务派遣或则劳务外包最大的员工账号
     *
     * @return java.lang.String
     * @author guoqiao
     * @since 2021/3/1 16:10
     */
    String findMaxStaffName();

    List<McStaff> listPageByQuery(McStaffQuery query);

    /**
     * 根据员工电话查询启用的并且有钉钉userId的员工信息
     *
     * @param mobile 员工股电话
     * @return
     */
    List<McStaff> listByMoblieAndDTalkIdIsNotNull(String mobile);

    List<McStaff> listByMobile(String mobile);

    List<McStaffVO> listPageInfoByQuery(McStaffQuery query);

    List<McStaff> listByQuery(McStaffQuery query);

    List<McStaff> listSimpleByQuery(McStaffQuery query);

    List<VtDTO> listVtByStatus(@Param("status") Integer status, @Param("staffStatusList") List<Integer> staffStatusList, @Param("number") Integer number);

    List<McStaff> listSubStaffByQuery(McStaffQuery query);

    /**
     * 角色集合查询员工信息，返回角色id
     *
     * @param query
     * @return
     */
    List<McStaffSimpleDTO> listStaffByRoleIdsIncludeRoleId(McStaffQuery query);


    List<McStaff> listBsStaffInfo(@Param("list") List<Integer> bsUserIds);

    /**
     * 描述: 根据指定部门（本级及下级）取得员工（在职、启用、非工程师）id列表
     *
     * @param deptIds 部门ID集合，可以为一级部门ID、二级部门ID、三级部门ID
     * @return
     * @author guoqiao
     * @since 2021/3/5 17:52
     */
    List<Integer> listStaffIdByDeptIds(@Param("deptIds") List<Integer> deptIds);

    /**
     * 描述: 根据员工id集合、部门id、状态，查询员工id与姓名
     *
     * @param staffIdList 员工id集合
     * @param deptId      部门id
     * @param status      状态：1 停止 2 正常/启用
     * @return List<StaffIdAndRealNameDRO>
     * @author xujie
     * @since 2021/04/28
     **/
    List<StaffIdAndRealNameDRO> listStaffIdByStaffIdListAndDeptIdAndStatus(@Param("staffIdList") List<Integer> staffIdList,
                                                                           @Param("deptId") Integer deptId,
                                                                           @Param("status") Integer status);

    /**
     * 描述: 根据员工id集合查询钉钉Id
     *
     * @param staffIdList 员工id集合
     * @return List<StaffIdAndDTalkId>
     * @author xujie
     * @since 2021/04/28
     **/
    List<StaffIdAndDTalkId> listStaffIdAndDTalkIdByStaffIdList(@Param("staffIdList") List<Integer> staffIdList);

    /**
     * 描述: 根据员工id集合查询部门Id
     *
     * @param staffIdList 员工id集合
     * @return List<StaffIdAndDeptId>
     * @author xujie
     * @since 2021/05/28
     **/
    List<StaffIdAndDeptId> listStaffIdAndDeptIdByStaffIdList(@Param("staffIdList") List<Integer> staffIdList);

    Integer countByQuery(McStaffQuery query);

    /**
     * 根据dTalkId统计数据（排除当前员工，判断dTalkId是否重复）
     *
     * @param staffId 排除的员工Id
     * @param dTalkId 钉钉userId
     * @return
     */
    Integer countByDTalkIdAndNotStaffId(@Param("staffId") Integer staffId, @Param("dTalkId") String dTalkId);

    /**
     * 根据staffNumber统计数据（排除当前员工，判断staffNumber是否重复）
     *
     * @param staffId     排除的员工Id
     * @param staffNumber 员工工号
     * @return
     */
    Integer countBystaffNumberAndNotStaffId(@Param("staffId") Integer staffId, @Param("staffNumber") String staffNumber);

    Integer countPageInfoByQuery(McStaffQuery query);

    Integer updateByKey(McStaff staff);

    Integer updateDTalkId(McStaff staff);

    Integer updateBsStaff(McStaff staff);

    Integer updatePassword(McStaff staff);

    Integer updateInitPasswordByKey(@Param("password") String password, @Param("updater") String updater, @Param("staffId") Integer staffId);

    Integer updateLastLoginTime(McStaff staff);

    Integer updateWhitelist(McStaff staff);

    Integer updatePermitSelf(McStaff staff);

    Integer updateDpermitSelf(McStaff staff);

    Integer updateDpermitOrgSelf(McStaff staff);

    Integer updateDpermitDeptSelf(McStaff staff);

    Integer updateDpermitAreaSelf(McStaff staff);

    Integer updateDpermitCooperationSelf(McStaff staff);

    Integer updateDpermitCubeSelf(McStaff staff);

    Integer updateDpermitMeasureSelf(McStaff staff);

    Integer updateDpermitProductSelf(McStaff staff);

    Integer updateDpermitAccountSelf(McStaff staff);
    Integer updateDpermitChannelSelf(McStaff staff);

    /**
     * 根据员工ID更新员工钉钉userId
     *
     * @param dTalkId 员工钉钉userId
     * @param staffId 员工ID
     * @param updater 操作人
     * @return
     */
    Integer updateDtalkIdByStaffId(@Param("staffId") Integer staffId, @Param("dTalkId") String dTalkId, @Param("updater") String updater);

    Integer updateStatus(McStaff staff);

    Integer updateStatusBatch(StatusDTO dto);

    Integer updateSort(McStaff staff);

    /**
     * 根据北森数据更新
     *
     * @param staff
     * @return
     */
    Integer updateByBsInfo(McStaff staff);

    /**
     * 根据北森数据新增
     *
     * @param staff
     * @return
     */
    Integer insetByBsInfo(McStaff staff);

    Integer insert(McStaff staff);


    Integer deleteByKey(Integer staffId);

    /**
     * 新增北森数据同步员工
     *
     * @param staff
     * @return
     */
    Integer insertBsStaff(McStaff staff);

    /**
     * 根据北森用户ID统计数据，并排除当前员工
     *
     * @param staffId  排除的员工Id
     * @param bsUserId 北森用户ID
     * @return
     */
    Integer countByBsUserIdAndNotStaffId(@Param("staffId") Integer staffId, @Param("bsUserId") Integer bsUserId);

    /**
     * 根据员工ID更新员工钉钉userId
     *
     * @param staffId  员工ID
     * @param bsUserId 员工北森用户ID
     * @param updater  操作人
     * @return
     */
    Integer updateBsUserIdByStaffId(@Param("staffId") Integer staffId, @Param("bsUserId") Integer bsUserId, @Param("updater") String updater);

    /**
     * 查询所有的北森用户ID
     *
     * @return
     */
    List<StaffIdAndBsUserId> listStaffIdAndBsUserId();

    /**
     * 更新员工工作时间
     *
     * @param staff 员工信心
     */
    void updateWorkTime(McStaff staff);

    /**
     * 通过北森用户ID查询员工
     *
     * @param bsUserId 北森用户ID
     * @return
     */
    McStaff findByBsUserId(@Param("bsUserId") Integer bsUserId);

    /**
     * 根据邮箱获取员工钉钉ID
     *
     * @param mail
     * @return
     */
    String getDTalkIdByMail(@Param("mail") String mail);

    /**
     * 描述: 根据部门id更新员工的部门名称
     *
     * @param deptId
     * @param deptName
     * @author guoqiao
     * @since 2022/1/24 16:06
     */
    void updateDeptNameByDeptId(Integer deptId, String deptName);

    /**
     * 描述: 根据一二级部门Id查询员工
     *
     * @param deptOneId  deptOneId
     * @param deptTwoIds deptTwoIds
     * @return java.util.List<com.zmn.mcc.model.entity.staff.McStaff>
     * @author jiafei
     * @since 2022/7/27 14:48
     */
    List<McStaff> listSimpleStaffByDeptIds(@Param("deptOneId") Integer deptOneId, @Param("deptTwoIds") List<Integer> deptTwoIds);

    /**
     * 描述: 查询下级员工
     *
     * @param leaderIds leaderIds
     * @return java.util.List<com.zmn.mcc.model.entity.staff.McStaff>
     * @author jiafei
     * @since 2022/7/28 16:27
     */
    List<McStaff> listByLeaderIds(@Param("leaderIds") List<Integer> leaderIds);
}
